Skip to content

fix(locate): a find inside a container obeys the same zone limit as the rest - #4196

Merged
bylins merged 1 commit into
masterfrom
fix/locate-object-container-zone
Nov 14, 2026
Merged

bylins merged 1 commit into
masterfrom
fix/locate-object-container-zone

Conversation

@bylins

@bylins bylins commented Nov 14, 2026

Copy link
Copy Markdown
Owner

С доски ошибок: Ромбар, 07.06, комната 27285 — «филактерия находится в каменной чаше. вз все чаш — Каменная чаша пуста».

Что было

У SpellLocateObject четыре ветки, по месту находки. Три из них держат поиск в своей зоне, четвёртая — нет:

где лежит что печатает показывает из чужой зоны
в комнате «находится в комнате 'имя'» нет
в инвентаре «находится у N в инвентаре» нет для мобов
надето «надето на N» нет для мобов
в контейнере «находится в каменной чаше» да

Ветка контейнера к тому же единственная, которая не называет места вовсе — только вид контейнера.

В мире пять каменных чаш, из них две в одной зоне (272: #27230 и #27236), и филактерий там же две (#27235 и #27252). Игрок прочитал сообщение, заглянул в чашу перед собой и нашёл её пустой — заклинание показало другую, может быть и с другого конца мира.

Что стало

const auto *container = i->get_in_obj();
const auto *holder = container->get_carried_by() ? container->get_carried_by()
                                                 : container->get_worn_by();
bool same_zone = false;
if (holder) {
    same_zone = !holder->IsNpc()
        || (holder->in_room != kNowhere
            && world[ch->in_room]->zone_rn == world[holder->in_room]->zone_rn);
} else if (container->get_in_room() != kNowhere && container->get_in_room()) {
    same_zone = world[ch->in_room]->zone_rn == world[container->get_in_room()]->zone_rn;
}
if (!same_zone) {
    return false;
}

Зона контейнера берётся там же, где он лежит: комната, руки или надет. Игрока показываем из любой зоны — так же, как это делает ветка «в инвентаре» для предмета, который игрок несёт сам.

Не затронуты: сундуки дружин (своя ветка выше, она называет дружину), персональные хранилища и почта (последняя ветка, у них ни владельца, ни места), боги — отсечка под !privilege::IsGod(ch).

Подсчёт matched не меняется: он увеличивается до всех этих проверок, так что игрок, у которого находка отсеклась, получает прежнее «ничего не почувствовали», а не «такого предмета нет».

Сборка с тестами: 875 тестов, 872 прошли, 3 отключены.

🤖 Generated with Claude Code

…he rest

У "разыскать предмет" четыре ветки по месту находки. Три из них держат
поиск в своей зоне: вещь в чужой комнате, у чужого моба в руках или
надетую на нём заклинание не печатает вовсе. Ветка "внутри контейнера"
этой отсечки не имела, и места она не называет -- только вид контейнера:
"филактерия находится в каменной чаше".

Каменных чаш в мире пять, две из них в одной зоне, и филактерий там же
две. Игрок читал сообщение, заглядывал в чашу перед собой и находил её
пустой: заклинание показало другую, хоть с другого конца мира.

Зона контейнера берётся там же, где он лежит: комната, руки или надето.
Игрока показываем из любой зоны -- так же, как ветка "в инвентаре".
Хранилища и почта идут отдельной веткой и не затронуты, богов отсечка
не касается.

С доски ошибок: Ромбар, 07.06, комната 27285.

Сборка с тестами: 875 тестов, 872 прошли, 3 отключены.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@bylins
bylins merged commit 5e9d759 into master Nov 14, 2026
20 checks passed
@bylins
bylins deleted the fix/locate-object-container-zone branch November 14, 2026 10:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant